#include<bits/stdc++.h>
#define int long long
using namespace std; 
int n,a[405];
int vis[405],ans;
int tot,head[805],nxt[805],to[805];
int c[405];

char buf[(1<<21)+5],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;
}

void add(int u,int v){
	nxt[++tot]=head[u];
	to[tot]=v;
	head[u]=tot;
}
void dfs(int x,int s){
	if(x>n){
		ans=max(ans,s);
		return;
	}
	int b[12];
	for(int i=1;i<=n;i++) b[i]=a[i];
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			for(int w=head[i];w;w=nxt[w]){
				if(!vis[to[w]]) a[to[w]]+=a[i];
			}
			vis[i]=1;
			dfs(x+1,s+a[i]);
			vis[i]=0;
			for(int j=1;j<=n;j++) a[j]=b[j];
		}
	}
}
signed main(){
	freopen("light.in","r",stdin);
	freopen("light.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1,u,v;i<n;i++){
		u=read();v=read();
		add(u,v);
		add(v,u);
	}
	if(n<=10){
		dfs(1,0);
		printf("%lld",ans);
		return 0;
	}
	int m=n;
	while(m--){
		int t=0;
		for(int i=1;i<=n;i++){
			if(!vis[i]&&a[i]>a[t]) t=i;
		}
		ans+=a[t];
		vis[t]=1;
		for(int i=head[t];i;i=nxt[i]){
			if(!vis[to[i]]) a[to[i]]+=a[t];
		}
	}
	printf("%lld",ans);
	return 0;
}
